// 负责发送邮件（使用126邮箱SMTP）
package main

import (
	"crypto/tls"
	"fmt"
	"net/smtp"
	"strings"
)

// EmailConfig 邮件配置（需要用户填写）
type EmailConfig struct {
	SmtpServer  string // SMTP服务器地址（126邮箱是smtp.126.com）
	SmtpPort    string // SMTP端口（126邮箱用465）
	FromAddress string // 发件人邮箱（你的126邮箱）
	AuthCode    string // 邮箱授权码（不是登录密码）
	ToAddress   string // 收件人邮箱（可以填自己的126邮箱测试）
}

// SendEmail 发送邮件
func SendEmail(config EmailConfig, subject, body string) error {
	// 1. 构建邮件内容（必须符合邮件格式）
	// 邮件头部：发件人、收件人、主题
	header := make(map[string]string)
	header["From"] = config.FromAddress
	header["To"] = config.ToAddress
	header["Subject"] = subject
	header["Content-Type"] = "text/plain; charset=UTF-8" // 纯文本内容

	// 拼接头部信息
	var headerLines []string
	for k, v := range header {
		headerLines = append(headerLines, fmt.Sprintf("%s: %s", k, v))
	}
	headerStr := strings.Join(headerLines, "\r\n")

	// 完整邮件内容 = 头部 + 空行 + 正文
	fullContent := fmt.Sprintf("%s\r\n\r\n%s", headerStr, body)

	// 2. 连接SMTP服务器并发送
	// 服务器地址：smtp.126.com:465
	addr := fmt.Sprintf("%s:%s", config.SmtpServer, config.SmtpPort)

	// 认证信息（用发件人邮箱和授权码）
	auth := smtp.PlainAuth("", config.FromAddress, config.AuthCode, config.SmtpServer)

	// 因为126邮箱465端口需要TLS加密，所以用tls.Dial创建连接
	conn, err := tls.Dial("tcp", addr, &tls.Config{
		ServerName: config.SmtpServer, // 验证服务器证书的名称
	})
	if err != nil {
		return fmt.Errorf("连接SMTP服务器失败：%v", err)
	}
	defer conn.Close()

	// 创建SMTP客户端
	client, err := smtp.NewClient(conn, config.SmtpServer)
	if err != nil {
		return fmt.Errorf("创建SMTP客户端失败：%v", err)
	}

	// 登录认证
	if err := client.Auth(auth); err != nil {
		return fmt.Errorf("邮箱认证失败（检查授权码）：%v", err)
	}

	// 设置发件人
	if err := client.Mail(config.FromAddress); err != nil {
		return fmt.Errorf("设置发件人失败：%v", err)
	}

	// 设置收件人
	if err := client.Rcpt(config.ToAddress); err != nil {
		return fmt.Errorf("设置收件人失败：%v", err)
	}

	// 发送邮件内容
	data, err := client.Data()
	if err != nil {
		return fmt.Errorf("准备发送内容失败：%v", err)
	}
	_, err = data.Write([]byte(fullContent))
	if err != nil {
		return fmt.Errorf("发送内容失败：%v", err)
	}
	data.Close()

	// 退出连接
	client.Quit()

	return nil
}
